package fr.babos.navigation.bootstrap 
{
	import flash.display.DisplayObjectContainer;
	import fr.babos.core.bootstrap.Bootstrap;
	import fr.babos.core.bootstrap.IBootstrap;
	import fr.babos.core.log.Log;
	import fr.babos.navigation.routes.IRouter;
	
	/**
	 * @author ZoulouX
	 */
	public class NavigationBootstrap extends Bootstrap implements INavigationBootstrap
	{
		/**
		 * Routeur connecté
		 */
		protected var _router							:IRouter;
		
		/**
		 * Routeur connecté
		 */
		public function get router ():IRouter { return _router; }
		public function set router (value:IRouter):void 
		{
			// Déconnecter l'ancien routeur
			if (_router != null)
			{
				// Ne plus écouter les changements sur le routeur
				_router.onURLChange.remove(updateFromRouter);
			}
			
			// Enregistrer le nouveau routeur
			_router = value;
			
			// Connecter le nouveau routeur
			if (_router != null)
			{
				// Ecouter les changements d'URL et non pas de route (l'URL peut changer les params sans changer la route)
				_router.onURLChange.add(updateFromRouter);
			}
		}
		
		/**
		 * Le constructeur
		 * @param	pViewContainer : Le container pour les vues
		 */
		public function NavigationBootstrap (pViewContainer:DisplayObjectContainer = null)
		{
			super(pViewContainer);
		}
		
		/**
		 * Ouvrir une commande
		 * @param	pCommandName : Le nom de la commande
		 * @param	pParams : Les paramètres associés à cette commande
		 */
		override public function open (pCommandName:String, pParams:Object = null):void
		{
			// Vérifier si on a un routeur
			if (_router != null)
			{
				// On ouvre sur le routeur et on attend que ça retombe via signal
				_router.open(pCommandName, pParams);
			}
			else
			{
				// On ouvre directement
				directOpen(pCommandName, pParams);
			}
		}
		
		/**
		 * Ouvrir une route sans passer par le routeur
		 * @param	pCommandName : Le nom de la commande
		 * @param	pParams : Les paramètres associés à cette commande
		 */
		public function directOpen (pCommandName:String, pParams:Object = null):void
		{
			// On ouvre directement
			super.open(pCommandName, pParams);
		}
		
		/**
		 * Le routeur change de route.
		 * Actualiser la commande depuis le routeur.
		 * Peut être appelé lorsqu'un routeur est associé a ce bootstrap, et que l'on veut forcer la prise en compte.
		 */
		public function updateFromRouter ():void
		{
			// Si on a une route
			if (_router.currentRoute != null)
			{
				// Essayer d'ouvrir la commande de cette route sur le super bootstrap
				super.open(_router.currentRoute.command, _router.currentParams);
			}
			else
			{
				// S'occuper du cas 404
				Log.warning("TODO : implement 404 in NavigationBootstrap !");
			}
		}
	}
}